﻿//6.1.5文本编码与Unicode
//字符集是一种字符配置，每一对配置包含一个数字码或代码点。
//通常使用的字符集有两种：Unicode和ASCII。
//Unicode具有约1百万个字符的地址空间，包含世界上使用最广泛的语言，以及一些历史语言和特殊符号。
//ASCII字符集只是Unicode字符集的前128个字符，它包含U.S.风格键盘上的大多数字符。

//.NET的文本编码有两类：
//    一类是将Unicode字符映射到其他字符集
//    一类是使用标准的Unicode编码模式
//第一类包含遗留编码方式
//第二类是UTF-8、UTF-16和UTF-32（和废弃的UTF-7）

using System;
using System.Text;

namespace _156_字符串与文本处理_文本编码与Unicode
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.获取一个Encoding对象
            // System.Text中的Encoding类是封装文本编码类的通用基本类型。
            Encoding utf8 = Encoding.GetEncoding("utf-8");
            Encoding chinese = Encoding.GetEncoding("GB18030");//非遗留的GB18030，这是从2000年以来在中国或销售往中国的应用程序强制要求的标准。
            //最常用的编码也可以通过专用的Encoding静态属性获取：
            //编码名称  Encoding的静态属性
            //UTF-8     Encoding.UTF-8
            //UTF-16    Encoding.Unicode(非UTF-16)
            //UTF-32    Encoding.UTF32
            //ASCII     Encoding.ASCII

            foreach (EncodingInfo info in Encoding.GetEncodings())
                Console.WriteLine(info.Name);
            System.IO.File.WriteAllText("data.txt", "Testing...", Encoding.Unicode);
            //如果省略最后一个参数，WriteAllText会使用最普遍的UTF-8编码方式。
            //提示：UTF-8是所有文件和流I/O的默认文本编码方式。

            //3.将Encoding转换为字节数组
            //Encoding对象和字节数组之间也可以互相转换。
            //GetBytes方法将使用指定的编码方式将string转换为byte[]；而GetString则将byte[]转换为string。
            byte[] utf8Bytes = Encoding.UTF8.GetBytes("0123456789");
            byte[] utf16Bytes = Encoding.Unicode.GetBytes("0123456789");
            byte[] utf32Bytes = Encoding.UTF32.GetBytes("0123456789");

            Console.WriteLine(utf8Bytes.Length); //10
            Console.WriteLine(utf16Bytes.Length);//20
            Console.WriteLine(utf32Bytes.Length);//40

            string original1 = Encoding.UTF8.GetString(utf8Bytes);
            string original2 = Encoding.Unicode.GetString(utf16Bytes);
            string original3 = Encoding.UTF32.GetString(utf32Bytes);

            Console.WriteLine(original1); //0123456789
            Console.WriteLine(original2); //0123456789
            Console.WriteLine(original3); //0123456789

            Console.ReadKey();
        }
    }
}
